S-오라클 KO16MSWIN949 한글 설정
개요
데이터를 넣었으나, 한글이 제대로 나오지 않는 이슈가 존재한다.
한글 설정
처음에는 이것을 sys로 들어가서 해준다.
기본적으로 한국어를 사용할 수 있도록 시스템 속성을 설정하는 부분인 듯하다.
이 설정을 적용하기 위해서는 서버를 껐다가 켜야 한다.
shutdown immediate
startup mount
꺼준 다음, 다시 스타트를 시킨다.
이때 그냥 스타트를 하면 데이터베이스가 오픈되는 상태로 열리는데, mount 옵션을 주면 마운트까지만 하고 멈춘다.
이 상태에서 위의 명령들을 실행해서 데이터베이스의 기본 문자 속성을 변경한다.
이후에는 다시 끄고, 스타트를 시켜야 한다.
판단의 흐름
- dbeaver에서 나오는 출력이 잘못 되고 있는 것일 것이다.
- E-리눅스 dbeaver 설치#한글 설정에서 진행한 부분.
- 이에 대해 각종 설정을 하려고 찾아봤으나, 어려웠다.
- 언어에 내가 원하는 KO16MSWIN949가 보이지 않았다.
- 일단 ini 파일을 수정하여 디폴트 값을 바꿀 수 있다기에 그것으로 최대한 시도
- 이것을 위해 스냅으로 깐 디비버를 삭제하고 다시 설치
- 실패
- 그럼 안 속에 설정이 뭔가 잘못 됐을 수도 있다.
- 내부에 한글이 들어가는지부터 체크하자.
- 그러나 막상 보니 설정 출력문도 깨져 나오고 있었다.
- 그럼 일단 내부 설정을 다시 해보자.
- 이때부터 주 설정은 디비 컨테이너에 들어가서 진행했다.
select name, value$ from props$ where name in ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');
- 이걸로 내부 상태를 확인했다.
- 사람들 글을 보니 각 값을 활용해서 환경변수까지 지정해야 한다고 했다.
- https://m.blog.naver.com/tpgpfkwkem0/221485965035
- 계속 실패하다가
export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949
를 하니 다시 영어로 출력이 걸리기 시작 - 이게 맞는 줄만 알고 내부 설정을 전부 아메리카로 바꿔보기도 함.
- 그래도 바뀌는 게 없었다.
- KO머시기는 한글에만 해당되는 것 같던데, 아무래도 위 설정이 안 먹혀서 기본인 영어가 출력되고 있나보다.
- 즉, sqlplus와 같은 클라이언트들은 자신의 환경변수 값을 참조해서 출력을 한다는 것.
- 다시
export NLS_LANG=KOREAN_KOREA.KO16MSWIN949
로 바꿈.
- 한글이 적혔어야 할 아무 테이블에 들어가서 계속 한글을 insert하는 실험 진행
- 한글을 넣을 때 valid하게 '가 닫히지 않았다고 함
- 여기에서 또 많은 가짓수를 실험하다가..
- 혹시 이거 터미널에서 입력이나 출력이 들어갈 때 인코딩이 잘못 되고 있는 것은 아닐까?
- 내가 친 명령어가 어떻게 전달되는가?
- 결국 인코디코딩을 거칠 것이다.
- 이 놈이 문제라면, 아무리 안 속 설정이 잘 되도 나한테 보이는 것은 이상하게 보일 것 같다.
그리고..갖은 노력을 들여서 결국 원인을 찾은 것 같다.
거의 4시간은 넘은 듯.
왜 물음표로 들어갔는지는 아직 사실 명확하지 않다.
그래서 파일을 뜯어봤는데, 내 컴퓨터의 어떤 인코딩 방식으로도 해당 파일을 정확하게 인코딩해낼 수가 없었다.
아무래도 내 생각에는 여기에서 문제가 발생하는 것 같다.
select name, value$ from props$ where name in ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_NCHAR_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='AMERICAN' WHERE NAME='NLS_LANGUAGE';
UPDATE SYS.PROPS$ SET VALUE$='AMERICA' WHERE NAME='NLS_TERRITORY';
COMMIT;
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_NCHAR_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='KOREAN_KOREA.KO16MSWIN949' WHERE NAME='NLS_LANGUAGE';
UPDATE SYS.PROPS$ SET VALUE$='AMERICA' WHERE NAME='NLS_TERRITORY';
COMMIT;
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_NCHAR_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='KOREAN' WHERE NAME='NLS_LANGUAGE';
UPDATE SYS.PROPS$ SET VALUE$='KOREA' WHERE NAME='NLS_TERRITORY';
COMMIT;
export NLS_LANG=KOREAN_KOREA.KO16MSWIN949
export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949
일단 시도해보던 다양한 해결책들.
https://blog.naver.com/lanterlt/221018208258
지금 내 생각에는, 애초에 파일이 잘못됐다고 생각하고 진행하는 게 좋을 것 같다.
이것을 적용하기 전에 이미 내 디비는 KO 머시기로 바뀌어 있는 상태였다.
그런데 이놈을 받을 때 제대로 디코딩을 해내지 못했다는 것은 애초에 이 파일의 인코딩이 잘못됐다고 생각하는 게 현명한 것 아닐까.
아니면 이걸 적용할 때까지는 디비 컨테이너에 환경 변수 설정을 하지 않았었으니까, 이걸 그대로 한번 더 해보는 방법도 있다.
그렇다면 그 방법을 해보고, 안 되면 uft 8 버전의 스크립트도 있는 것 같으니 그쪽으로 방향을 틀자.
일단 이렇게 해야 한다고 한다.
모든 글이 이렇게 하고 있는데, 이 책만 NLS_LANGUAGE에 짬뽕시키라고 하고 있다..
하하.. 드디어 성공했다.
데이터 세팅하는데 30분 가량 소요되기 때문에 이 시도가 안 되면 대충 한 시간을 날려야만 했을 텐데, 다행이 잘 작동했다.
정리
정리를 해보자면, 일단 데이터를 넣는 과정에서 데이터는 ms949 방식으로 인코딩되어있었다.
이 상태에서 sqlplus를 실행하는 환경은 utf8이었고, 결국 데이터가 저장될 때 전부 이상하게 저장되는 결과가 나왔다.
그래서 일단 nls 설정을 바꾸어 ms949로 sqlplus 세션을 연결했다.
이후에 데이터는 잘 들어가게 됐다.
이때 내게 출력이 나오는 부분이 어딘지도 신경을 써줘야 하는 게, 터미널로 입출력을 하고 있다면 터미널 인코딩이 utf8일 경우 당연히 한글이 확인이 안 된다.
데이터는 잘 저장된 상황이라 여기에서 헷갈리면 안 된다.